package com.h.chatroom.common.interceptor;

import com.h.chatroom.common.util.JwtUtils;
import io.jsonwebtoken.JwtException;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.util.MultiValueMap;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;
import java.util.Map;

// 自定义拦截器，在 WebSocket 握手阶段 就把 前端传来的 令牌 进行解析，进而得到 userId 和 username
public class AuthHandshakeInterceptor implements HandshakeInterceptor {
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                                   WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        // 从 前端 那里 WebSocket连接的时候的 URL 需要进行处理，进而得到 Token，这里需要用 URI 得到
        URI uri = request.getURI();
        MultiValueMap<String, String> params = UriComponentsBuilder.fromUri(uri).build().getQueryParams();
        // 这样就把前端的令牌拿到，对于这个令牌进行解析，得到令牌中的 userId 和 username
        String token = params.getFirst("userToken");
        // 验证令牌 是否存在
        if(token == null || token.isEmpty()) {
            // 令牌不存在
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return false;
        }
        // 令牌存在，进行解析
        try {
            Object userId = JwtUtils.parseToken(token).get("userId");
            Object username = JwtUtils.parseToken(token).get("username");
            attributes.put("userId",userId);
            attributes.put("username",username);
        }catch (JwtException e) {
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return false;
        }

        return true;
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
                               WebSocketHandler wsHandler, Exception exception) {

    }
}
